#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//struct stu {
//	char name[20];
//	int age;
//};
//
//int cmp(const void* q1,const void *q2) {
//	return strcmp(((struct stu*)q2)->name, ((struct stu*)q1)->name);
//}

//void print(struct stu* s,int sz) {
//	for (int i=0; i < sz; i++) {
//		
//	}
//}

//int main() {
//	struct stu arr[2] = { {"zs",28 }, { "lao",20 } };
//	int arr2[] = { 1,2,3,4,5 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(arr[0]), cmp);
//	//print(arr, sz);
//	return 0;
//}

void print(int arr[], int sz) {
	for (int i = 0; i < sz; i++) {
		printf("%d", arr[i]);
	}
}

int cmp_int(const void* p1, const void* p2) {
	return *(int*)p1 - *(int*)p2;
}

void swap(char* p1, char* p2,int width) {
	for (int i = 0; i < width;i++) {
		char tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2++;
	}
}

void my_qsort(void* base, size_t sz, size_t width, int (*cmp)(const void* p1, const void* p2)) {
	for (int i = 0; i < sz-1; i++) {
		for (int j = 0; j < sz - i - 1; j++) {
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0) {
				swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
			}
		}
	}
}

void test() {
	int arr[] = { 2,1,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print(arr, sz);
}

int main() {
	test();
}